Spring Security-তে Authorization পরিচালনা করতে @PreAuthorize এবং @Secured অ্যানোটেশন ব্যবহার করা হয়। এগুলো মেথড-লেভেল অথোরাইজেশনের জন্য ব্যবহৃত হয়। এর মাধ্যমে নির্ধারণ করা হয় কোন ব্যবহারকারী বা রোল নির্দিষ্ট মেথড অ্যাক্সেস করতে পারবে।
@PreAuthorize এবং @Secured এর মধ্যে পার্থক্য
| বৈশিষ্ট্য | @PreAuthorize | @Secured |
|---|---|---|
| অধিকরণ | Spring Security Expression ব্যবহার করে। | শুধুমাত্র রোল ভিত্তিক। |
| সাপোর্ট | জটিল স্পেলিং সমর্থন করে (e.g., hasRole, hasAuthority, @annotation). | সহজ অথোরাইজেশন সমর্থন করে। |
| ব্যবহার ক্ষেত্র | মেথড লেভেল অথোরাইজেশনের জন্য। | সরাসরি রোল চেক করার জন্য। |
1. @PreAuthorize ব্যবহার করা
@PreAuthorize Spring Security-এর স্পেলিং ভাষা ব্যবহার করে অথোরাইজেশন পরিচালনা করে। এটি মেথড চালানোর আগে চেক করে।
কনফিগারেশন
import org.springframework.context.annotation.Configuration;
import org.springframework.security.config.annotation.method.configuration.EnableMethodSecurity;
@Configuration
@EnableMethodSecurity
public class SecurityConfig {
// No specific method-level security configuration needed.
}
মেথড উদাহরণ
import org.springframework.stereotype.Service;
import org.springframework.security.access.prepost.PreAuthorize;
@Service
public class MyService {
@PreAuthorize("hasRole('ADMIN')")
public String adminAccess() {
return "Admin Access Granted";
}
@PreAuthorize("hasRole('USER')")
public String userAccess() {
return "User Access Granted";
}
@PreAuthorize("hasRole('USER') and hasRole('ADMIN')")
public String adminAndUserAccess() {
return "Admin and User Access Granted";
}
@PreAuthorize("#username == authentication.name")
public String accessOwnProfile(String username) {
return "Accessing own profile: " + username;
}
}
2. @Secured ব্যবহার করা
@Secured সরাসরি রোল নির্ধারণের জন্য ব্যবহৃত হয়। এটি অপেক্ষাকৃত সহজ অথোরাইজেশন প্রয়োজন হলে ব্যবহৃত হয়।
কনফিগারেশন
import org.springframework.context.annotation.Configuration;
import org.springframework.security.config.annotation.method.configuration.EnableMethodSecurity;
@Configuration
@EnableMethodSecurity(securedEnabled = true) // Enable @Secured annotation
public class SecurityConfig {
// No specific method-level security configuration needed.
}
মেথড উদাহরণ
import org.springframework.stereotype.Service;
import org.springframework.security.access.annotation.Secured;
@Service
public class MyService {
@Secured("ROLE_ADMIN")
public String adminAccess() {
return "Admin Access Granted";
}
@Secured("ROLE_USER")
public String userAccess() {
return "User Access Granted";
}
@Secured({"ROLE_USER", "ROLE_ADMIN"})
public String adminAndUserAccess() {
return "Admin and User Access Granted";
}
}
Spring Security Context-এ রোল এবং অথোরিটি ব্যবস্থাপনা
In-Memory Authentication উদাহরণ
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.security.core.userdetails.User;
import org.springframework.security.core.userdetails.UserDetails;
import org.springframework.security.provisioning.InMemoryUserDetailsManager;
@Configuration
public class UserConfig {
@Bean
public InMemoryUserDetailsManager userDetailsManager() {
UserDetails user = User.withDefaultPasswordEncoder()
.username("user")
.password("password")
.roles("USER") // ROLE_USER হবে
.build();
UserDetails admin = User.withDefaultPasswordEncoder()
.username("admin")
.password("admin")
.roles("ADMIN") // ROLE_ADMIN হবে
.build();
return new InMemoryUserDetailsManager(user, admin);
}
}
3. Controller স্তরে @PreAuthorize এবং @Secured
Controller উদাহরণ
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.RestController;
import org.springframework.security.access.prepost.PreAuthorize;
import org.springframework.security.access.annotation.Secured;
@RestController
public class MyController {
@GetMapping("/admin")
@PreAuthorize("hasRole('ADMIN')")
public String adminPage() {
return "Welcome Admin!";
}
@GetMapping("/user")
@Secured("ROLE_USER")
public String userPage() {
return "Welcome User!";
}
@GetMapping("/profile")
@PreAuthorize("#username == authentication.name")
public String profile(@RequestParam String username) {
return "Welcome to your profile, " + username;
}
}
4. @PreAuthorize এর শক্তিশালী স্পেলিং উদাহরণ
উন্নত অথোরাইজেশন
@PreAuthorize("hasAuthority('WRITE_PRIVILEGE') and hasRole('ADMIN')")
public String adminWriteAccess() {
return "Admin Write Access Granted";
}
@PreAuthorize("hasAuthority('READ_PRIVILEGE') or hasRole('USER')")
public String userOrReadAccess() {
return "User or Read Access Granted";
}
উপসংহার
- @PreAuthorize: জটিল অথোরাইজেশন লজিক প্রয়োগের জন্য ব্যবহার করা হয়।
- @Secured: সহজ এবং নির্দিষ্ট রোল ভিত্তিক অথোরাইজেশনের জন্য কার্যকর।
আপনার প্রয়োজন অনুযায়ী এই অ্যানোটেশনগুলো ব্যবহার করতে পারেন। @PreAuthorize জটিল লজিক এবং স্পেলিং ব্যবহারের জন্য আরও শক্তিশালী এবং কার্যকর।
Read more